package com.redis;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise;

import java.nio.charset.StandardCharsets;

/**
 * @author 罗俊华
 * @date 2021/8/27 - 2:12 下午
 */
public class RedisProtocolChannelOutBoundHandler extends ChannelOutboundHandlerAdapter {


    // 会车和换行
    static byte[] newLine = {13, 10};

    /**
     * 手动实现 redis 协议解析
     * set key value 应该被解析为
     * *3
     * $3
     * set
     * $3
     * key
     * $5
     * value
     * 注意每一个末尾都有会车换行
     * $3 其中3不能是int，应该为 48+3，因为 0是48
     * @param ctx
     * @param msg
     * @param promise
     * @throws Exception
     */
    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {

        ByteBuf buffer = ctx.alloc().buffer();

        String[] split = msg.toString().trim().split(" ");
        buffer.writeByte('*');
        //
        buffer.writeBytes(String.format("%s", split.length).getBytes(StandardCharsets.UTF_8));

        buffer.writeBytes(newLine);
        for (String str : split) {
            buffer.writeByte('$');
            buffer.writeBytes(String.format("%s", str.length()).getBytes(StandardCharsets.UTF_8));
            buffer.writeBytes(newLine);

            buffer.writeBytes(str.getBytes());
            buffer.writeBytes(newLine);
        }

        super.write(ctx, buffer, promise);
    }
}
